'use strict';
const moment = require('moment');
const path = require('path');
const fs = require('fs');
const async = require('async');
const superagent = require('superagent');
const CONFIG = require('../../../common/config');
const codeUtil = require('../commonUtils/codeUtil');
const YjxCustVideoUserDocModel = require('../../../common/yjxMysql/mapping/YjxCustVideoUserDocModel');
const YjxUniItemsModel = require('../../../common/yjxMysql/mapping/YjxUniItemsModel');
const YjxUserModel = require('../../../common/yjxMysql/mapping/YjxUserModel');
const YjxUniUserDocModel = require('../../../common/yjxMysql/mapping/YjxUniUserDocModel');
const retUtil = require('../commonUtils/retUtil');
const YjxVideoResModel = require('../../../common/yjxMysql/mapping/YjxVideoResModel');
const rpcFunc = require('../../routes/rpcSrv/rpcFunc');

const videoServiceUtil = (function () {

    function videoServiceUtil() {

    }

    /**
     * 创建用户视频文档
     *
     * @author 王俊
     * @date 2018-08-07
     *
     * @param {Object} options
     * @param {Number} options.device       设备编号见接口文档
     * @param {Number} [options.no]           平台编号, 主要用于小程序
     * @param {Number} options.opType       1 竖屏(单页/印品等)  2 视频  3 PPT, 4 自由创建, 5 文字转视频
     * @param {Number} options.userId       用户唯一标识
     * @param {Number} [options.sizeId]     作品尺寸id, opType 为 4, 5 时需传递
     * @param {Number} [options.tmplId]     作品对应模板id, 当 opType 为 2 时需传递
     * @param {String} options.docString    作品对应的文档 json 字符串
     *
     * @param {Function} callback 回调函数
     *                      error: 失败
     *                      data: {
     *                          docId: 统一作品标识
     *                          productId: 作品子表标识
     *                      }
     */
    videoServiceUtil.createVideoUserDoc = function(options, callback){
        if(options.opType === 5) {
            return videoServiceUtil.createTextVideoUserDoc(options, callback);
        }
        return callback('暂不支持的文档类型', null);
    };

    /**
     * 创建统一作品
     *
     * @author 王俊
     * @date 2017-11-19
     *
     * @param {Object} options
     * @param {Number} options.userId
     * @param {Number} options.opType 1 设计(废弃), 2 视频, 3 ppt(废弃), 4, 自由创建作品, 5 文字转视频
     * @param {Number} [options.tmplId] options.opType 为 2 时, 指定模板 id
     * @param {Number} [options.watermark] 作品是否携带水印, 默认为 0
     * @param {Function} callback  回调
     *          err: 创建统一作品失败
     *          {
     *              uniDocId: 统一作品标识
     *              tmplBaseInfo: {
     *                    uni_item_id     : 统一模板标识
     *                    item_type       : 统一模板类型, 10 设计模板 20 ppt 模板 30 视频模板
     *                    item_id         : 模板子表 id(设计模板子表, ppt 模板子表, 视频模板子表)
     *                    tmpl_set_id     : 该模板所属模板组 id
     *                    tmpl_set_title  : 该模板所属模板组标题
     *                    show_type_id    : 该模板所属显示分类 id
     *                    show_type_title : 该模板所属显示分类标题
     *              }
     *          }
     *
     */
    videoServiceUtil.createUniUserDoc = function (options, callback) {
        var tasks = [];
        // 1. 查验用户
        tasks.push(function (callback) {
            var entity = new YjxUserModel({
                user_id : options.userId,
                del_flg : 0
            });
            entity.findFromDB(function (error, users) {
                if(error || !users || users.length <= 0) {
                    return callback(error || '该用户不存在');
                }
                var data = {};
                data.userInfo = users[0];
                return callback(error, data);
            }, 0,1);
        });
        // 2. 查验模板
        tasks.push(function (data, asyCallback) {
            if(options.opType === 4 || options.opType === 5) {
                data.tmplBaseInfo = {
                    show_type_id : 2,   // 显示分类, 写死为 2
                    form_id : 0,        // 自由创建, 暂不支持表单
                };
                return asyCallback(null, data)
            }
            var uniEntity = new YjxUniItemsModel();
            uniEntity.getUniTmplShowTyeInfo(options.tmplId, function (error, tmplBaseInfo) {
                data.tmplBaseInfo = tmplBaseInfo;
                return asyCallback(error, data);
            });
        });
        // 3. 创建统一用户作品
        tasks.push(function (data, asyCallback) {
            var uniDoc = new YjxUniUserDocModel({
                user_id: options.userId,
                watermark : options.watermark || 0,
                show_type_id : data.tmplBaseInfo.show_type_id,
                form_id : data.tmplBaseInfo.form_id,    // 作品携带表单 id
                form_flg : 0,                           // 表单收集功能默认 0:不使用表单
                update_by : options.userId
            });
            uniDoc.saveToDB(function (saveErr, uniDocId) {
                data.uniDocId = uniDocId;
                return asyCallback(saveErr, data);
            })
        });
        // 顺序执行
        async.waterfall(tasks, function (newUniDocErr, data) {
            if(newUniDocErr) {
                return callback(newUniDocErr, null);
            }
            var retData = {
                uniDocId: data.uniDocId, tmplBaseInfo: data.tmplBaseInfo
            };
            return callback(newUniDocErr, retData);
        });
    };


    /**
     * 创建用户文字转视频文档
     *
     * @author 王俊
     * @date 2018-08-07
     *
     * @param {Object} options
     * @param {Number} options.device       设备编号见接口文档
     * @param {Number} [options.no]           平台编号, 主要用于小程序
     * @param {Number} options.userId       用户唯一标识
     * @param {String} options.docString    作品对应的文档 json 字符串
     * @param {String} [options.docName]    作品名称, 默认为我的作品
     * @param {Number} [options.sizeId]     作品尺寸id, opType 为 4, 5 时需传递
     * @param {Function} callback 回调函数
     *                      error: 失败
     *                      data: {
     *                          docId: 统一作品标识
     *                          productId: 作品子表标识
     *                      }
     */
    videoServiceUtil.createTextVideoUserDoc = function (options, callback) {
        const totalTasks = [];
        // 1. 创建统一作品
        totalTasks.push(function (callback) {
            var opt = {
                userId : options.userId,
                opType : 5,     // 标记文字转视频(无模板)
                watermark: 1,   // 文字转视频作品有水印
            };
            videoServiceUtil.createUniUserDoc(opt, function (error, uniDocInfo) {
                var data = {};
                data.uniDocInfo = uniDocInfo;
                return callback(error, data);
            });
        });
        // 2. 创建子作品
        totalTasks.push(function (data, callback) {
            const entity = new YjxCustVideoUserDocModel({
                user_id : options.userId,
                uni_doc_id : data.uniDocInfo.uniDocId,
                doc_name: options.docName || '我的作品',
                size_id : options.sizeId,
                purpose: options.no || 0,
                data: options.docString,
                dirty: 1,
                state: 0,
                update_by: options.userId
            });
            entity.saveToDB(function (error, productId) {
                data.retData = {
                    docId: data.uniDocInfo.uniDocId,
                    productId: productId
                };
                return callback(error, data);
            });
        });

        // 流式执行
        async.waterfall(totalTasks, function (error, data) {
            if(error) {
                return callback(error, null);
            }
            return callback(error, data.retData);
        });
    };








    /**
     * 修改视频文档
     *
     * @author 毛凯
     * @date 2018-08-07
     *
     * @param {Object} options
     * @param {Number} options.device       设备标识
     * @param {Number} options.opType       1 竖屏(单页/印品等)  2 视频  3 PPT, 4 自由创建, 5 文字转视频
     * @param {Number} options.userId       用户唯一标识
     * @param {Number} options.docId       统一的作品id
     * @param {String} options.docJson    文档结构, 参见项目
     *
     * @param {Function} callback 回调函数
     *                      error: 失败
     *                      data: {
     *                            // 作品唯一标志(统一作品标识)
     *                           "docId": 1233,
     *                           // 作品唯一标志(子表标识)
     *                           "product": 78,
     *                      }
     */
    videoServiceUtil.updateVideoDoc = function(options, callback) {
        if(options.opType === 5) {
            return videoServiceUtil.updateTextVideoDoc(options, callback);
        }
        return callback('暂不支持的文档类型', null);
    };


    /**
     * 修改文字视频文档
     *
     * @author 毛凯
     * @date 2018-08-07
     *
     * @param {Object} options
     * @param {Number} options.device       设备标识
     * @param {Number} options.opType       1 竖屏(单页/印品等)  2 视频  3 PPT, 4 自由创建, 5 文字转视频
     * @param {Number} options.userId       用户唯一标识
     * @param {Number} options.docId       统一的作品id
     * @param {String} options.docJson    文档结构, 参见项目
     *
     * @param {Function} callback 回调函数
     *                      error: 失败
     *                      data: {
     *                            // 作品唯一标志(统一作品标识)
     *                           "docId": 1233
     *                      }
     */
    videoServiceUtil.updateTextVideoDoc = function(options, callback) {
        const doc = retUtil.safe_parser_JSON_string(options.docJson);
        if(!doc) return callback('文档格式有误', null);
        const entity = new YjxCustVideoUserDocModel();
        options.docString = JSON.stringify(options.docJson); // 转成纯字符串
        entity.updateTextVideoDocInfo(options, function (error, data) {
            return callback(error,{docId:options.docId || 0});
        });
    };



    /**
     * 203-获取文字视频预览
     *
     * @author 毛凯
     * @date 2018-08-07
     *
     * @param {Object} options
     * @param {Number} options.device      设备标识
     * @param {Number} options.docId       作品统一模板id
     * @param {Number} [options.userId]      用户唯一标识
     * @param {Function} callback 回调函数
     *                      error: 失败
     *                      data: {
     *                         "id":4903,                  // 作品唯一标识
     *                           "opType":5,                 // 业务分类, 暂定如下: 1 竖屏(单页/印品等)  2 视频  3 PPT, 4 自由创建, 5 文字转视频
     *                           "docNm":"欢度国庆",         // 作品名称
     *                           "createDay" : "2017-11-05", // 作品创建日期
     *                           "video":{                  // 当作品使用视频展示时返回此字段, 若作品需要使用图片展示时此字段为空
     *                               "thumbs":[              // 视频缩略图
     *                                 "http://itbour-generate.oss-cn-hangzhou.aliyuncs.com/image/U30330/2016/11/06/091954617_IqjCfwBAzWz7I683nMRf/0.jpg"
     *                               ],
     *                               "videoUrl" : "http://itbour-generate.oss-cn-hangzhou.aliyuncs.com/image/U30330/2016/11/06/091954617_IqjCfwBAzWz7I683nMRf/0.mp4",
     *                               "duration" : 100,       // 视频时长, 单位:秒
     *                               "videoSize" : 4093200,  // 视频文件大小, 单位: Byte, 前端计算使用1000做进制转换, 避免出现流量显示与使用不一致的情况
     *                               "w":720,
     *                               "h":1280,
     *                           },
     *                      }
     */
    videoServiceUtil.getTextVideoPreview = function(options, callback) {
        var totalTasks = [];
        // 1. 获取作品信息
        totalTasks.push(function (callback) {
            var entity = new YjxUniUserDocModel();
            entity.getUserVideoInfo(options.docId,function (error, docInfo) {
                if(error || !docInfo || docInfo.length <=0 ) {
                    return callback(error || '该作品不存在或已删除', null);
                }
                var doc = docInfo[0];
                var data = {};
                data.docEntity = doc;
                // 作品有修改, 或状态没有生成成功
                if (data.docEntity.dirty || data.docEntity.state !== 3) {
                    data.needTypeset = true;
                }
                return callback(error, data);
            });
        });
        // 2. 按需排版
        totalTasks.push(function (data, callback) {
            if(!data.needTypeset) {
                return callback(null, data);
            }
            var opt = {
                docId : data.docEntity.doc_id,
                watermark : !data.docEntity.wm_paid ? 1 : 0,
                quality: 1
            };
            rpcFunc.typesetTxtVideoUserDoc(opt, function (error, result) {
                data.typesetResult = result;
                return callback(error, data);
            })
        });
        // 3. 按需重新获取作品信息
        totalTasks.push(function (data, callback) {
            if(!data.needTypeset) {
                return callback(null, data);
            }
            var entity = new YjxCustVideoUserDocModel({
                uni_doc_id : options.docId,
                user_id : data.docEntity.user_id,
                del_flg : 0
            });
            entity.findFromDB(function (error, docs) {
                if(error || !docs || docs.length <=0 ) {
                    return callback(error || '该作品不存在或已删除', null);
                }
                data.docEntity = docs[0];
                return callback(error, data);
            });
        });
        // 4. 获取视频资源信息
        totalTasks.push(function (data, callback) {
            var resId = data.docEntity.res_high;
            resId = resId ? resId : data.docEntity.res_mid;
            resId = resId ? resId : data.docEntity.res_low;

            var entity = new YjxVideoResModel({
                res_id : resId,
                del_flg : 0
            });
            entity.findFromDB(function (error, resources) {
                if(error || !resources || resources.length <=0) {
                    return callback(error || '预览失败', null);
                }
                var res = resources[0];
                // 构建返回值
                data.retData = {
                    id : data.docEntity.uni_doc_id,
                    opType: 5, //文字视频
                    docNm : data.docEntity.doc_name,
                    createDay: (new moment(data.docEntity.create_time)).format('YYYY-MM-DD'),
                    video : {
                        thumbs : retUtil.safe_parser_JSON_string(data.docEntity.thumbs),
                        videoUrl: res.url,
                        duration: res.duration,
                        videoSize: res.file_size,
                        w: res.w,
                        h: res.h
                    }
                };
                return callback(error, data);
            });
        });
        // 流式执行
        async.waterfall(totalTasks, function (error, data) {
            if(error) return callback(error, null);
            return callback(error, data.retData);
        });
    };


    /**
     * 获取视频文档内容
     *
     * @author 毛凯
     * @date 2018-08-07
     *
     * @param {Object} options
     * @param {Number} options.device      设备标识
     * @param {Number} options.docId       作品统一模板id
     * @param {Number} options.userId      用户唯一标识
     * @param {Function} callback 回调函数
     *                      error: 失败
     *                      data: {
     *                         "id":4903,                  // 作品唯一标识
     *                           "opType":5,                 // 业务分类, 暂定如下: 1 竖屏(单页/印品等)  2 视频  3 PPT, 4 自由创建, 5 文字转视频
     *                           "docNm":"欢度国庆",         // 作品名称
     *                           "createDay" : "2017-11-05", // 作品创建日期
     *                           "video":{                  // 当作品使用视频展示时返回此字段, 若作品需要使用图片展示时此字段为空
     *                               "thumbs":[              // 视频缩略图
     *                                 "http://itbour-generate.oss-cn-hangzhou.aliyuncs.com/image/U30330/2016/11/06/091954617_IqjCfwBAzWz7I683nMRf/0.jpg"
     *                               ],
     *                               "videoUrl" : "http://itbour-generate.oss-cn-hangzhou.aliyuncs.com/image/U30330/2016/11/06/091954617_IqjCfwBAzWz7I683nMRf/0.mp4",
     *                               "duration" : 100,       // 视频时长, 单位:秒
     *                               "videoSize" : 4093200,  // 视频文件大小, 单位: Byte, 前端计算使用1000做进制转换, 避免出现流量显示与使用不一致的情况
     *                               "w":720,
     *                               "h":1280,
     *                           },
     *                      }
     */
    videoServiceUtil.getVideoContent = function(options, callback) {
        const totalTasks = [];
        //通过统一作品id判断作品类型拿到作品类型和子表id
        const entity = new YjxUniUserDocModel();
        totalTasks.push(function (callback) {
            entity.checkUniUserDocTypeByUniId(options.docId, function (err,result) {
                if (err){
                    return callback(err, null);
                }
                const data = {};
                data.userDocInfo  = result;
                data.retData = {};
                return callback(null,data);
            })
        });
        //通过id和类型直接去对应的表查询视频文档内容
        totalTasks.push(function (data,callback) {
            if ( data.userDocInfo[0].doc_type === 40 &&  (data.userDocInfo[0].purpose >= 200 && data.userDocInfo[0].purpose <=300 )){
                videoServiceUtil.getTextVideoContent(data.userDocInfo[0],function (err,videoContent) {
                    if (err){
                        return callback(err, null);
                    }
                    data.retData = videoContent;
                    return callback(null,data);
                });
            }else{
                return callback("暂不支持该分类",null);
            }
        });
        // 流式执行
        async.waterfall(totalTasks, function (error, data) {
            if(error) {
                return callback(error, null);
            }
            return callback(error, data.retData);
        });
    };

    /**
     * 获取文字视频文档内容
     *
     * @author 毛凯
     * @date 2018-08-07
     *
     * @param {Object} videoInfo
     * @param {Number} videoInfo.doc_id       作品id
     * @param {Function} callback      作品信息
     *
     */
    videoServiceUtil.getTextVideoContent = function (videoInfo,callback) {
        //获取文字视频信息
        const entity = new YjxCustVideoUserDocModel();
        entity.getCustuserVideoInfo(videoInfo,function (err,result) {
            if (err){
                return callback(err,null);
            }
            if (!result || !result[0] || result.length <= 0){
                return callback("作品状态异常,请检查",null);
            }
            const coreStruct = retUtil.safe_parser_JSON_string(result[0].data);
            coreStruct.id = result[0].doc_id;
            var textVideoContent = {
                "id": result[0].uni_doc_id,
                "productId": result[0].doc_id,
                "opType": 5,                // 5 标记文字转视频
                "docName": result[0].doc_name,
                "createTimestamp": result[0].createTimestamp,
                "width": result[0].width,
                "height": result[0].height,
                "duration": result[0].duration || 0,
                "coreStruct": coreStruct
            };
            return callback(null,textVideoContent);
        });
    };



    return videoServiceUtil;
})();

module.exports = videoServiceUtil;